﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace конфигуратор
{
    public class Команда      // адрес некорого объекта
    {
        public string Агент;          //  АгентФайлов    =СУБЪЕКТ      // для памяти (кучи) Агент отсутвует поскольку это должен быть список кучи параметр это ссылка на объект(адрес памяти)
        public string Цель;         //   ПолучитьОбъект     = ЦЕЛЬ                               // для содержания файла BinaryReader и BinaryWriter
        public Dictionary<string, object> Средства;      // имя файла    // пареметром может быть другой адрес        ЭТО СРЕДСТВА ДОСТИЖЕНИЯ ЦЕЛИ
        public Команда ВложеннаяКоманда;    // следующая команда

        public object ПолучитьРезультат ()        // вложенная команда
        {
            dynamic agent = СоздатьАгент();
            foreach ( KeyValuePair<string, object> keyValuePair in Средства )
            {
                if ( keyValuePair.Value.GetType() == typeof( Команда ) )
                    Средства[keyValuePair.Key] = (( Команда ) keyValuePair.Value).ПолучитьРезультат(); // замена  адресов значениями, хотя есть вариант когда передать надо именно адрес
                // адрес или парметр должен иметь указание на целевого испонителя(агента)
            }
            object результат = Выполнить( agent, Цель, Средства, ВложеннаяКоманда );

            return результат;
        }

        private object Выполнить ( object agent, string команда, Dictionary<string, object> параметры, Команда вложеннаякоманда )
        {
            throw new NotImplementedException();
        }
                                                                                    
        private object СоздатьАгент ()
        {
            throw new NotImplementedException();
        }

        // для объекта   это
         void test()
         {
             var f = new Команда() {Агент = "АгентФайлов", Цель = "ПолучитьОбъект "};
             f.Средства["имя файла"]= "e://файл.расш" ;
             // АгентДиспетчера.ПолучитьДиспетчер( Имя = дис1)/АгентДиспетчера.ПолучитьОбъект( имя = строка)

         }


    }

    public class АгентДиспетчера
    {
       public object ПолучитьДиспетчер(Dictionary<string, object> параметры, Команда команда)
       {
           var дис= диспетчер.СловарьДиспетчеров["Имя"];
           команда.Средства["диспетчер"] = дис;
           var рез =   команда.ПолучитьРезультат();
           return рез;
       }
       public object ПолучитьПараметрДиспетчер ( Dictionary<string, object> параметры, Команда команда )
       {
           return диспетчер.СловарьДиспетчеров["Имя"];         //здесь результат сам агент, его не надо создавать
           
       }
        public object ПолучитьОбъект(Dictionary<string, object> средства, Команда команда )
        {
            var дис =(диспетчер) средства["диспетчер"];
            return дис.НайтиПервыйПаспортПоИмени((string) средства["имя"]).Объект;
        }
    }

    public class АгентСтрок
    {
        public string Соединить( Dictionary<string, object> параметры, Команда команда  )
        {
            return (string) параметры["1"] + (string) параметры["2"];
        }
    }

}
